package com.xiaoma.common.adapter.utils

import androidx.recyclerview.widget.DiffUtil

/**
 * author: liangjingbo
 * date: 2022/6/22
 * describe:
 */
abstract class XmDefaultCallback<T> : DiffUtil.Callback() {

    private val mOldDataList = mutableListOf<T>()
    private val mNewDataList = mutableListOf<T>()


    abstract fun isTheSameItem(oldItem: T, newItem: T): Boolean

    abstract fun isTheSameContent(oldItem: T, newItem: T): Boolean

    fun handle(
        oldDataList: List<T>,
        newDataList: List<T>,
        detectMoves: Boolean = false
    ): DiffUtil.DiffResult {
        this.mOldDataList.clear()
        this.mOldDataList.addAll(oldDataList)

        this.mNewDataList.clear()
        this.mNewDataList.addAll(newDataList)

        return DiffUtil.calculateDiff(this, detectMoves)
    }

    override fun getOldListSize(): Int {
        return mOldDataList.size
    }

    override fun getNewListSize(): Int {
        return mNewDataList.size
    }

    /**
     * areItemsTheSame() 返回 true 的时候，会回调 areContentsTheSame()
     * 该函数通常用来判断是不是新老 Item 是否为同一个 Item，如： Item id 是不是一样的
     */
    override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
        return isTheSameItem(mOldDataList[oldItemPosition], mNewDataList[newItemPosition])
    }

    /**
     * 当 areItemsTheSame() 返回 true 的时候回调该函数
     * 通常用来识别同新老同一个 Item 内容是否发生变化，如：新老 Item 唯一 id 一致，但浏览次数是否一样？
     */
    override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
        return isTheSameContent(mOldDataList[oldItemPosition], mNewDataList[newItemPosition])
    }

    /**
     * 当 areItemsTheSame() 返回 true,areContentsTheSame() 返回 false 时，会回调该函数
     * 该函数默认返回 null，该函数配合
     * RecyclerView.Adapter::onBindViewHolder(VH holder, int position,List<Object> payloads)
     * 可实现只更新 ItemHolder 中某个 View，而不是刷新整个 ItemHolder
     */
    override fun getChangePayload(oldItemPosition: Int, newItemPosition: Int): Any? {
        return super.getChangePayload(oldItemPosition, newItemPosition)
    }
}